<h1>Tutorial - Basic (Nieuws pagina)</h1>

<p>In de voorgaande delen heb je wat basis onderdelen geleerd van het framework door een controller
    te schrijven die statische pagina's inlaadt. Ook hebben we de URI netter gemaakt doormiddel van
    routing. En nu gaan we beginnen aan onze nieuws pagina, deze is dynamisch en gaat gebruik maken
    van een database.</p>

<br />

<h2>Het opzetten van een "Model"</h2>

<p>Voor onze nieuws applicatie gaan we een model gebruiken, welke zorgt voor de interactie met de
database. In je models defineer je simpel weg methodes als bijvoorbeeld <strong>getNews()</strong>, deze methode
zou simpelweg alleen nieuws uit de database halen en deze returnen. Voordat we onze model maken, maken we eerst
een database met een tabel waar we onze nieuws berichten in opslaan. Connect naar je database en voer de onderstaande
query uit:</p>

<div class="code">
<?php
highlight_string('CREATE table news (
    id INT(11) NOT NULL AUTO_INCREMENT,
    title VARCHAR(128) NOT NULL,
    article TEXT NOT NULL,
    PRIMARY KEY (id),
    KEY title (title)
);
');
?>
</div>

<p>Nu heb je de database table <strong>news</strong> opgezet. Voeg wat test records toe, zodat we straks ook
wat nieuws artikelen te zien krijgen. Ben je te lui om dit te doen, voer dan onderstaande query uit op de tabel
<strong>news</strong>:</p>


<div class="code">
<?php
highlight_string('INSERT INTO `news` (
    `id` ,
    `title` ,
    `article`
)
VALUES (
    NULL ,  \'Batman crashed!\',  \'Last night, Batman crashed into a wooden tree! 
    He survived the accident and is now in the hospital. We think Batman tried to save 
    a cat, but he claims he was attacked by a dog.\'
    ), (
    NULL ,  \'Cat stuck in tree\',  \'Last night, a cat named "G" was stuck in a tree. 
    His owner said that he was building a treehouse, but residents don\'t believe this. 
    G was saved by Spiderman, who accidentally came by.\'
);
');
?>
</div>

<p>We hebben nu een gevulde nieuws tabel! Nu wordt het tijd om onze nieuws model te schrijven
zodat we de data uit de database kunnen halen en kunnen gebruiken in onze applicatie. Maak
het volgende bestand aan <strong>application/models/NewsModel.php</strong> en geef het de volgende inhoud:</p>

<div class="code">
<?php
highlight_string('<?php
// We geven aan dat dit bestand zich bevind in het pakket: application/models
namespace application\models;

// We hebben de Model class nodig uit system\core
use system\core\Model;

class NewsModel extends Model
{
    /**
     * Get news
     *
     * Get all the news from the database.
     *
     * @return array
     */
    public function getNews()
    {
        // We hebben toegang tot de "db" property, omdat we de Model class extenden
        return $this->db->get(\'news\')->result();
    }
}
');
?>
</div>

<p>We hebben hier een methode genaamd: <strong>getNews()</strong>. Deze methode accepteert geen
argumenten en geeft een array terug. Wat deze methode doet, staat beschreven in het 
<a href="http://en.wikipedia.org/wiki/PHPDoc" target="_blank">DocBlock</a>. We gebruiken DocBlock
zodat we in onze controllers precies kunnen zien wat elke methode kan en doet, zonder elke keer
weer naar je Model bestand te gaan (je IDE moet dit wel ondersteunen!).</p>

<p>In de methode <strong>getNews()</strong> gebruiken we <strong>$this->db</strong>. Deze property
komt uit de Model class (onze model extend deze), deze property bevat een instantie van de 
<strong>ActiveRecord</strong> class, waardoor we enorm gemakkelijk kunnen communiceren met de database!
Alle ActiveRecord methodes zijn goed gedocumenteerd met DocBlock en erg gemakkelijk in gebruik. In 
de code hierboven, gebruiken wij de <strong>get()</strong> methode, deze methode haalt alles op uit de
tabel die je meegeeft als argument aan de methode. Deze produceert een query die er ongeveer zo uit ziet:</p>

<div class="code">
SELECT * FROM `news`
</div>

<p>De <strong>get()</strong> methode geeft alleen een object terug, namelijk een <strong>PDOStatement</strong> object. Hier kunnen we
    verder weinig mee in onze controller. Daarom roepen wij de methode <strong>result()</strong>. Deze methode
    loopt door alle resultaten en slaat ze op in een array. Als je maar 1 rij als resultaat terug wilt, kun je ook de
    methode <strong>row()</strong> gebruiken.</p>

<p>Dit is onze model... Heel erg simpel en duidelijk. We zouden nu onze nieuws model
kunnen gebruiken in een controller. Dit gaan wij in het volgende deel doen!</p>

<p>Oo, voordat je verder gaat, zorg ervoor dat je database gegevens goed staan ingesteld in je
<strong>settings.ini</strong>, dit kan in de <strong>[database]</strong> sectie.</p>

<br />

<h2>Nieuws Controller opzetten</h2>

<p>Hiervoor hebben we een nieuws model opgezet die nieuws artikelen
uit een database kan ophalen. Nu gaan wij een nieuws controller maken,
die de nieuws artikelen uit de database toont. We beginnen natuurlijk bij het maken
van de controller zelf. Maak een nieuw bestand: 
<strong>application/controllers/News.php</strong> en geef het de volgende inhoud:</p>

<div class="code">
<?php
highlight_string('<?php
namespace application\controllers;

use system\core\Controller;
// We gaan de model NewsModel gebruiken, dus geven wij dit aan!
use application\models\NewsModel;

class News extends Controller
{
    /**
     * Index
     * 
     * Dit is de standaard actie die uitgevoerd wordt als er geen actie gedefineerd
     * is in de URI. Als je bijvoorbeeld de pagina: http://localhost/news aanroept
     * wordt automatisch de methode index() aangeroepen.
     */
    public function index()
    {
        // Aangezien we bovenaan NewsModel hebben gedefineerd, kunnen we hem gebruiken
        $newsModel = new NewsModel();
        
        // We roepen de getNews() methode aan en we slaan het resultaat hiervan op in
        // de $data array
        $data[\'news\'] = $newsModel->getNews();
        
        // Als laatst geven wij de variabelen aan die geladen moeten worden in de views.
        // Deze variabelen moeten altijd een array zijn, aangezien ze extract worden
        $this->load->vars($data);
    }
}');
?>
</div>

<p>We zien hier dat we op de 5de regel <strong>use application\models\NewsModel</strong>
hebben staan. We doen dit omdat we moeten aangeven welke onderdelen we gaan gebruiken.
Zou je dit niet doen, dan kun je de class niet direct aanroepen, maar zul je NewsModel
als volgt aan moeten roepen:</p>

<div class="code">
<?php
highlight_string('<?php
$newsModel = new \application\models\NewsModel();
');
?>
</div>

<p>Gebruik de methode die jij het fijnst vind. Wel raadt ik aan om de eerste methode
te gebruiken, je kunt zo in 1 oogopslag zien welke componenten er gebruikt worden
en je code wordt er ook duidelijker op!</p>

<p>Daarna zien we dat we een array definieren (<strong>$data</strong>). In deze
array gaan we alle data opslaan die we graag in de views willen gebruiken. We moeten 
een array definie&euml;ren aangezien de variabelen ge&euml;xtract worden zodra ze bij de view
aankomen. Hieronder zal ik een voorbeeld geven:</p>

<div class="code">
<?php
highlight_string('<?php
// Controller methode code
$data[\'name\'] = \'Steffen Brem\';

$this->load->vars($data);

// View code
<p>Mijn naam is: <?=$name?></p>
');
?>
</div>

<p>Wat je hier zit is een ge&euml;xtracte array, de key van de array wordt een 
variabele opzichzelf, zoals je kunt zien.</p>

<br />

<h2>De View</h2>

<p>We hebben nu al aardig wat gedaan, maar we hebben nog niet echt een resultaat
gezien. Wat we nu gaan doen is een view maken om onze nieuws artikelen te tonen.
We hebben in onze controller al het nieuws opgehaald en geladen om vervolgens door te
sturen naar de view. Aangezien wij gebruik maken van auto template rendering, gaat
G automatisch zoeken naar de view file. De opmaak van het pad hiervan is:</p>

<div class="code">
views/[controller]/[action].phtml
</div>

<p>Wij willen een view voor de controller <strong>News</strong> met de methode 
    <strong>index</strong>, dus onze view staat in:</p>

<div class="code">
views/news/index.phtml
</div>

<p>Bestaat dit bestand niet, dan zal je een fout melding krijgen waarin staat dat
de bovenstaande view niet gevonden kan worden. Maak nu het bestand <strong>
views/news/index.phtml</strong> aan met de volgende inhoud:</p>

<div class="code">
<?php
highlight_string('<h1>Nieuws</h1>

<?php foreach ( $news as $item ): ?>
    <h3><?=$item[\'title\']?></h3>
    
    <p><?=$item[\'article\']?></p>
    <hr />
<?php endforeach; ?>');
?>
</div>

<p>Je ziet hier dat we de variabele <strong>$news</strong> gebruiken. We kunnen deze
variabele gebruiken omdat we deze geladen hebben in onze controller. We doen een
simpele foreach loop door de news array en tonen de gegevens. Test het zelf maar
eens! Ga in je browser naar: <strong>http://localhost/news</strong>.</p>

<p>Haha, je kreeg een error he (Page Not Found)! Herinner je je onze routing nog?</p>

<div class="code">
<strong>[routing]</strong><br />
:any: = pages/view/$1
</div>

<p>Hij zal elke pagina door verwijzen naar <strong>pages/view/?</strong>. Tenzij! 
We aangeven dat news naar de news controller verwezen moet worden. Wat we dus gaan doen
is onze routing aanpassen. Open je <strong>settings.ini</strong> en ga naar de sectie
<strong>routing</strong>. Zorg ervoor dat deze er als volgt uitziet:

<div class="code">
<strong>[routing]</strong><br />
news = news<br />
:any: = pages/view/$1
</div>

<p>Probeer het nu nog eens, is het gelukt? Aai!</p>

<p>In deel 4 gaan we een pagina maken waar we nieuws artikelen kunnen toevoegen.
We leren hier onder andere hoe we <strong>FormValidation</strong> moeten gebruiken!</p>

<p>Ga verder naar: <a href="<?=base_url('tutorial/basic/add_news')?>">Nieuws artikelen toevoegen</a> (deel 4)</p>